// 也可以直接使用字面量进行类型的声明
let x: 10;
x = 10;

// 可以使用 | 来连接多个类型（联合类型）
let b: "male" | "female";
b = "male";
b = "female";

let d: boolean | string;
d = true;
d = "ts";

// any 表示时任意类型，一个变量设置类型为any后相当于对变量关闭了TS的类型检测
// 使用TS时，不建议使用any类型
// let e: any;

// 声明变量如果不指定类型，则TS解析器会自动判断变量的类型为any（隐士的any）
let e;
e = 'ts';
e = 10;
e = true;

// unknown 表示未知类型的值
let u: unknown;
u = 10;
u = 'ts';
u = [1, 2, 3];
u = false;

let s: string;

// e的类型时any可以赋值给任意变量
s = e;

// s = u; //报错提示：不能将类型“unknown”分配给类型“string”
// unknown实际上就是一个类型安全的any
// unknown类型的变量，不能直接赋值其他变量
u = 'hello'
if (typeof u === "string") {
  s = u;
}

// 类型断言：可以用来告诉解析器变量的实际类型
/**
 * 语法：
 *   1）变量 as 类型
 *   2）<类型>变量
 */
s = u as string;
s = <string>u;

// void 用来表示空，以函数为例，就表示没有返回值的函数
function fn(): void {
}

// never 表示永远不会返回结果
function fn2(): never {
  throw new Error('error...')
}